package thread;
//通过懒汉模式构建单例模式
class SingletonLazy{
    private static volatile SingletonLazy instance=null;
    //volatile不仅可以防止可见性问题，也可以防止指令重排序
    //正常情况创建对象的顺序 ，1.申请一片空间 2.在空间里创建对象 3.返回地址
    //但是编译器会重新排序，变成132，会更加高效，但是也会存在一个问题，
    //当执行第二步的时候，另一个线程发现此时instance不为null，就会跳过返回instance，但是现在instance
    //还没有创建好，就会报错

    private static Object locker=new Object();
     public static SingletonLazy getInstance(){
        if (instance==null) {
            //双重判断其实就是解救阻塞等待的问题，提高性能
            synchronized (locker) {
                //如果不加锁俩个线程，由于线程的调度分别就进入判读语句里一个线程new一个对象，这个对象
                //可能非常大，消耗太多资源，其实就是解决原子性的问题
                if (instance == null) {
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }


}
public class Demo28 {
}
